package com.playball.lottery.util;

import java.util.ArrayList;
import java.util.List;

public class FactoryNum {

	/**
	 * 计算注数 红球选8个， C（6，8）=8*7*6*5*4*3/1*2*3*4*5*6=28；
	 * 红球选17个，C（6，17）=17*16*15*14*13*12/1*2*3*4*5*6=12376，以此类推。
	 * 
	 * @param count
	 * @return
	 */
	public static float Ssq_Result(float num, int count) {
		return getFactorial(num, count);
	}

	public static float Dlt_Result(float num, int count) {
		return getFactorial(num, count);
	}

	/**
	 * 排列3 组选六计算注数
	 * 
	 * @param num
	 * @param count
	 * @return
	 */
	public static float Pl3_Result(float num, int count) {
		return getFactorial(num, count) / getFactorial(3, 3);
	}

	public static float Elv_Result(float num, int typeId) {
		float result = 1;
		switch (typeId) {
		case 7001:
			result = getFactorial(num, 1) / getFactorial(1, 1);
			break;
		case 7002:
		case 7011:
			result = getFactorial(num, 2) / getFactorial(2, 2);
			break;
		case 7003:
		case 7012:
			result = getFactorial(num, 3) / getFactorial(3, 3);
			break;
		case 7004:
			result = getFactorial(num, 4) / getFactorial(4, 4);
			break;
		case 7005:
			result = getFactorial(num, 5) / getFactorial(5, 5);
			break;
		case 7006:
			result = getFactorial(num, 6) / getFactorial(6, 6);
			break;
		case 7007:
			result = getFactorial(num, 7) / getFactorial(7, 7);
			break;
		case 7008:
			result = getFactorial(num, 8) / getFactorial(8, 8);
			break;
		case 7009:
			result = getFactorial(num, 2);
			break;
		case 7010:
			result = getFactorial(num, 3);
			break;
		}
		return result;
	}
	
	/**
	 * 11运夺金 任选玩法计算注数
	 * @param num
	 * @param typeId
	 * @return
	 */
	public static float ElvYDJ_Result(float num, int typeId) {
		float result = 1;
		switch (typeId) {
		case 6201:
			result = getFactorial(num, 1) / getFactorial(1, 1);
			break;
		case 6202:
		case 6211:
			result = getFactorial(num, 2) / getFactorial(2, 2);
			break;
		case 6203:
		case 6212:
			result = getFactorial(num, 3) / getFactorial(3, 3);
			break;
		case 6204:
			result = getFactorial(num, 4) / getFactorial(4, 4);
			break;
		case 6205:
			result = getFactorial(num, 5) / getFactorial(5, 5);
			break;
		case 6206:
			result = getFactorial(num, 6) / getFactorial(6, 6);
			break;
		case 6207:
			result = getFactorial(num, 7) / getFactorial(7, 7);
			break;
		case 6208:
			result = getFactorial(num, 8) / getFactorial(8, 8);
			break;
		case 6209:
			result = getFactorial(num, 2);
			break;
		case 6210:
			result = getFactorial(num, 3);
			break;
		}
		return result;
	}

	public static int Jc_Result(int num, int count) {
		return getFactorial(num, count) / getFactorial(count, count);
	}

	// 阶乘
	public static float getFactorial(float num, int count) {
		float result = 1;
		for (int i = 1; i < count + 1; i++) {
			result = num * result;
			if (result > 0) {
				num--;
			}
		}
		return result;
	}

	// 阶乘
	public static int getFactorial(int num, int count) {
		int result = 1;
		for (int i = 1; i < count + 1; i++) {
			result = num * result;
			if (result > 0) {
				num--;
			}
		}
		return result;
	}

	 public static List combine1(int[] a,int m){
	        int n = a.length;
	        List result = new ArrayList();
	        int[] bs = new int[n];
	        for(int i=0;i<n;i++){
	            bs[i]=0;
	        }
	        //初始化
	        for(int i=0;i<m;i++){
	            bs[i]=1;
	        }
	        boolean flag = true;
	        boolean tempFlag = false;
	        int pos = 0;
	        int sum = 0;
	        //首先找到第一个10组合，然后变成01，同时将左边所有的1移动到数组的最左边
	        do{
	            sum = 0;
	            pos = 0;
	            tempFlag = true; 
	            result.add(print(bs,a,m));
	            
	            for(int i=0;i<n-1;i++){
	                if(bs[i]==1 && bs[i+1]==0 ){
	                    bs[i]=0;
	                    bs[i+1]=1;
	                    pos = i;
	                    break;
	                }
	            }
	            //将左边的1全部移动到数组的最左边
	            
	            for(int i=0;i<pos;i++){
	                if(bs[i]==1){
	                    sum++;
	                }
	            }
	            for(int i=0;i<pos;i++){
	                if(i<sum){
	                    bs[i]=1;
	                }else{
	                    bs[i]=0;
	                }
	            }
	            
	            //检查是否所有的1都移动到了最右边
	            for(int i= n-m;i<n;i++){
	                if(bs[i]==0){
	                    tempFlag = false;
	                    break;
	                }
	            }
	            if(tempFlag==false){
	                flag = true;
	            }else{
	                flag = false;
	            }
	            
	        }while(flag);
	        result.add(print(bs,a,m));
	        
	        return result;
	    }
	    private static int[] print(int[] bs,int[] a,int m){
	        int[] result = new int[m];
	        int pos= 0;
	        for(int i=0;i<bs.length;i++){
	            if(bs[i]==1){
	                result[pos]=a[i];
	                pos++;
	            }
	        }
	        return result ;
	    }
	 
	 
	// 组合
	public static List combine(int a[], int m) {
		List<int[]> list = new ArrayList<int[]>();
		int n = a.length;
		boolean flag = false; // 是否是最后一种组合的标记
		// 生成辅助数组。首先初始化，将数组前n个彩豆素置1，表示第一个组合为前n个数。
		int[] tempNum = new int[n];
		for (int i = 0; i < n; i++) {
			if (i < m) {
				tempNum[i] = 1;

			} else {
				tempNum[i] = 0;
			}
		}
		list.add(createResult(a, tempNum, m));// 打印第一中默认组合
		do {
			int pose = 0; // 记录改变的位置
			int sum = 0; // 记录改变位置 左侧 1 的个数
			// 然后从左到右扫描数组彩豆素值的“10”组合，找到第一个“10”组合后将其变为“01”
			for (int i = 0; i < (n - 1); i++) {
				if (tempNum[i] == 1 && tempNum[i + 1] == 0) {
					tempNum[i] = 0;
					tempNum[i + 1] = 1;
					pose = i;
					break;
				}
			}
			list.add(createResult(a, tempNum, m));// 打印第一中默认组合
			// 同时将其左边的所有“1”全部移动到数组的最左端。
			for (int i = 0; i < pose; i++) {
				if (tempNum[i] == 1)
					sum++;
			}
			for (int i = 0; i < pose; i++) {
				if (i < sum)
					tempNum[i] = 1;
				else
					tempNum[i] = 0;
			}
			// 判断是否为最后一个组合：当第一个“1”移动到数组的m-n的位置，即n个“1”全部移动到最右端时，就得到了最后一个组合。
			flag = false;
			for (int i = n - m; i < n; i++) {

				if (tempNum[i] == 0)
					flag = true;
			}
		} while (flag);
		return list;
	}
	
	// 根据辅助数组和原始数组生成 结果数组 
	public static int[] createResult(int[] a, int[] temp, int m) { 
	   int[] result = new int[m]; 
	   int j = 0; 
	   for (int i = 0; i < a.length; i++) { 
	    if (temp[i] == 1) { 
	     result[j] = a[i]; 
	     j++; 
	    } 
	   } 
	   return result; 
	}


	public static int  Chu(int a,int b){
		int a1=1;
		for (int i =a; i >=1; i--) {
			a1=a1*i;
		}
		int b1=1;
		for (int j =b; j >=1; j--) {
			b1=b1*j;
		}

		for (int k =(a-b); k>=1; k--) {
			b1=b1*k;
		}
		return a1/b1;
	}
}
